package pe.com.hermes.hermetic.web.controller.consultas;

import pe.com.hermes.hermetic.beans.AuditBean;
import pe.com.hermes.hermetic.beans.ComprobanteServicioBean;
import pe.com.hermes.hermetic.beans.DenomiMonedaBean;
import pe.com.hermes.hermetic.beans.FechaCuentaBean;
import pe.com.hermes.hermetic.negocio.service.HermeticFacade;
import pe.com.hermes.hermetic.negocio.ultil.ConstantesHermetic;
import pe.com.hermes.hermetic.negocio.ultil.Util;
import pe.com.hermes.hermetic.web.controller.base.IController;
import pe.com.hermes.hermetic.web.controller.base.IWebOpciones;
import pe.com.hermes.hermetic.web.forms.HMF3010Form;

import pe.com.hermes.hermetic.web.forms.HMF3010Form;

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.SessionAttributes;

/**** Modificado 20101117 YNFR *****/
@SessionAttributes(value={"listadoUnidMone","listaCuentas","codOpci","desOpci"})
@RequestMapping("/mostrarHWF3010.html")
@Controller
public class SaldosRealesController implements IController{

        private Logger logger = Logger.getLogger(this.getClass());
        
        @Autowired
        private HermeticFacade servicioHermetic;
        
        @RequestMapping(method=RequestMethod.GET)
        protected String showForm(ModelMap model, HttpServletRequest request) throws Exception {

            HttpSession session = request.getSession(false);        
            if (request.getSession().getAttribute("usuario") == null)
                return FORM_SESSION_FINISH;

            List listaTransacciones = (List)session.getAttribute("listaMenu2");
            if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.CONSUL_SALDO_REALES)) {
                return FORM_ACCESS_NULL_VIEW;
            }

            String cliente = (String)request.getSession().getAttribute("cliente");
            String sucursal = (String)request.getSession().getAttribute("sucursal");

            HMF3010Form form = new HMF3010Form();
            form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
            
            try {
                String fecha = servicioHermetic.getFechaHoy();
                String horaServidor = servicioHermetic.getFecha2().substring(8, 13);
                
                form.setFechadesde(fecha);
                form.setHora(horaServidor);
                List listadoCuentas = servicioHermetic.getCuentas(sucursal, cliente);
                
                if (listadoCuentas != null) {
                    model.put("listaCuentas", listadoCuentas);                

                    //Por defecto esta marcado TODOS las cuentas            
                    String[] chksCuenta = Util.listToStringArray(listadoCuentas);     
                    //request.getSession(false).setAttribute("chksCuenta",chksCuenta);
                    String codCuentas = Util.arrayToString(chksCuenta,",");    
                    
                    //Agregar el codigo de cuenta de la pagina
                    List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal, cliente, "1");
                    if (listadoUnidMone != null) {
                        model.put("listadoUnidMone", listadoUnidMone);
                    }
                
                }
                AuditBean auditBean = new AuditBean(SALD_REALES);
                servicioHermetic.inseAudit(auditBean);
                session.setAttribute("chksCuenta",null);
                session.setAttribute("chksModulo",null);
                session.setAttribute("chksSucu",null);
                session.removeAttribute("tipoUnidMone");
                //form.setFechadesde(null);
                String codOpci = IWebOpciones.SALD_REALES;
                String desOpci = servicioHermetic.getDesOpci(codOpci, request);
                model.put("codOpci",codOpci);
                model.put("desOpci",desOpci);
                
            } catch (Exception e) {
                e.printStackTrace();
                logger.error("Error en el proceso. "+ e);
                return FORM_ERROR_VIEW;
            }        
            model.put(FORM_KEY,form);  
            return FORM_SALDOS_REALES_VIEW;
            
        }
        
        //private Logger logger = Logger.getLogger(this.getClass());
        
        @RequestMapping(params="accion=cargarModulo")
        protected String cargarModulo (ModelMap model,@ModelAttribute(FORM_KEY) HMF3010Form form, HttpServletRequest request) throws Exception {    
           
               HttpSession session = request.getSession(false);        
               if (request.getSession().getAttribute("usuario") == null)
                   return FORM_SESSION_FINISH;

               List listaTransacciones = (List)session.getAttribute("listaMenu2");
               if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.CONSUL_SALDO_REALES)) {
                   return FORM_ACCESS_NULL_VIEW;
               }    
               form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
               
               //int accionMapa = 1;
               String cliente = (String)request.getSession().getAttribute("cliente");
               String sucursal = (String)request.getSession().getAttribute("sucursal");
               String cuenta = form.getCuenta();
               
               try {

                   List listadoCuentas = 
                       servicioHermetic.getCuentas(sucursal, cliente);
                   if (listadoCuentas != null) {
                       model.put("listaCuentas", listadoCuentas);
                   }
                   List listaModulos = 
                       servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                              cuenta);
                   if (listaModulos != null) {
                       model.put("listaModulo", listaModulos);
                       form.setCuenta(cuenta);
                       form.setModulo(null);
                       form.setFechadesde("");
                       form.setHora("");
                     
                   }
               } catch (Exception e) {
                   e.printStackTrace();
                   //accionMapa = 0;
                   return FORM_ERROR_VIEW;
               }
               model.put(FORM_KEY,form);
               return FORM_SALDOS_REALES_VIEW;
           }

        @RequestMapping(params="accion=cargarFecha")
        protected String cargarFecha (ModelMap model,@ModelAttribute(FORM_KEY) HMF3010Form form, HttpServletRequest request) throws Exception {    
           
               HttpSession session = request.getSession(false);        
               if (request.getSession().getAttribute("usuario") == null)
                   return FORM_SESSION_FINISH;

               List listaTransacciones = (List)session.getAttribute("listaMenu2");
               if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.CONSUL_SALDO_REALES)) {
                   return FORM_ACCESS_NULL_VIEW;
               }    
               form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
               
               //int accionMapa = 2;
               String cliente  = (String)request.getSession().getAttribute("cliente");
               String sucursal = (String)request.getSession().getAttribute("sucursal");
               String cuenta = form.getCuenta();
               String boveda = form.getModulo();
               
               try {
                   int unidad = servicioHermetic.getTipoUnidadMonetaria(sucursal, 
                                                                     cliente, cuenta, 
                                                                     boveda);
                   if (unidad != 999) {
                       try {
                           FechaCuentaBean fcbean = servicioHermetic.getFechaCuenta(sucursal, 
                                                                     cliente, cuenta, 
                                                                     boveda);
                           form.setFechadesde(fcbean.getFecha());
                           form.setFechahasta(fcbean.getFecha());
                           form.setHora(fcbean.getHora());
                           form.setHoraori(fcbean.getHora());
                       } catch (Exception e) {
                           form.setFechadesde("");
                           form.setFechahasta("");
                           form.setHora("");
                           form.setHoraori("");
                       }
                   }

                   List listadoCuentas = 
                       servicioHermetic.getCuentas(sucursal, cliente);
                   if (listadoCuentas != null) {
                       model.put("listaCuentas", listadoCuentas);
                   }
                   List listaModulos = 
                       servicioHermetic.getBovedaCuenta(sucursal, cliente, 
                                                              cuenta);
                   if (listaModulos != null) {
                       model.put("listaModulo", listaModulos);
                       form.setCuenta(cuenta);
                       form.setModulo(boveda);

                   }
                   model.put(FORM_KEY,form);  
               } catch (Exception e) {
                   e.printStackTrace();
                   //accionMapa = 0;
                   return FORM_ERROR_VIEW;
               }

               return FORM_SALDOS_REALES_VIEW;
           }

        @RequestMapping(params="accion=mostrar")
        protected String mostrar (ModelMap model,@ModelAttribute(FORM_KEY) HMF3010Form form, HttpServletRequest request) throws Exception {    
           
               HttpSession session = request.getSession(false);        
               if (request.getSession().getAttribute("usuario") == null)
                   return FORM_SESSION_FINISH;

               List listaTransacciones = (List)session.getAttribute("listaMenu2");
               if (!Util.validaAccesoOpcion(listaTransacciones, ConstantesHermetic.CONSUL_SALDO_REALES)) {
                   return FORM_ACCESS_NULL_VIEW;
               }    
               form.setControl(ConstantesHermetic.CTE_CONTROL_ACTIVO);
               
               //int accionMapa = 3;
               String cliente = (String)request.getSession().getAttribute("cliente");
               String sucursal = (String)request.getSession().getAttribute("sucursal");
               form.setCliente(cliente);
               form.setSucursal(sucursal);               
               
               String cuentaXXX = form.getCuenta();
               String bovedaXXX = form.getModulo();
               String fecha = form.getFechadesde();
               String hora = form.getHora();
               String horaori = form.getHoraori();
               Date fechaHoy = new Date();
               SimpleDateFormat fomatoHoy = new SimpleDateFormat("yyyyMMdd");
               String fechaOri = fomatoHoy.format(fechaHoy);
               //int tipoUnidad = servicioHermetic.getTipoUnidadMonetaria(sucursal, cliente, cuenta, boveda);
               
                List listCuentas = new ArrayList(); 
                List listModulos = new ArrayList();                  
               
               try {
               
                   /************** Valores por defecto elegidos para Cuenta y Modulo *************/
                   // Cuentas
                    String[] chksCuenta = null;
                   if (form.getCuenta()!=null && form.getCuenta().equals(ConstantesHermetic.CTE_REP_CUENTA_TODOS)){
                       //TODOS las cuentas
                       listCuentas = servicioHermetic.getCuentas(form.getSucursal(), form.getCliente());  
                       chksCuenta = Util.listToStringArray(listCuentas);            
                       request.getSession(false).setAttribute("chksCuenta",chksCuenta);                 
                   }else{
                       //ALGUNAS cuentas
                       chksCuenta = (String[])request.getSession(false).getAttribute("chksCuenta");
                       request.getSession(false).setAttribute("chksCuenta",chksCuenta);
                   }
                   
                   // Modulos por Unidad Monetaria y Cuentas            
                   if (chksCuenta!=null && chksCuenta.length > 0 &&
                       form.getTipoUnidMone()!=null && !form.getTipoUnidMone().equals(ConstantesHermetic.CTE_REP_UNID_MONE_BLANCO)){            

                       String[] chksModulo = (String[])request.getSession(false).getAttribute("chksModulo");              
                       /*
                       if (Util.contDatosSession(chksModulo) > 0){
                           //Total en session mayor a CERO
                           request.getSession(false).setAttribute("chksModulo",chksModulo);                
                       }else{
                           //obtengo todos los modulos del tipo de unidad monetaria
                            String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                            listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                            //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                            chksModulo = Util.listToStringArray(listModulos);            
                            request.getSession(false).setAttribute("chksModulo",chksModulo);                   
                       }
                       */
                        String tipoUnidMoneSession =  (String)request.getSession(false).getAttribute("tipoUnidMone");        
                        String tipoUnidMone = request.getParameter("tipoUnidMone");
                        if((tipoUnidMone!=null && !tipoUnidMone.equals(tipoUnidMoneSession))){
                            String arrayCuentas = Util.arrayToString(chksCuenta,",");                
                            listModulos = servicioHermetic.getBovedaByCuentaMoneMulti(form.getSucursal(), form.getCliente(), arrayCuentas, form.getTipoUnidMone());
                            //listModulos = servicioHermetic.getBovedaCuenta(form.getSucursal(), form.getCliente(), arrayCuentas);                        
                            chksModulo = Util.listToStringArray(listModulos);            
                            request.getSession(false).setAttribute("chksModulo",chksModulo);
                        }  
                       if(Util.contDatosSession(chksModulo) < 1){
                           model.put("message","Seleccione al menos una boveda");
                           return FORM_SALDOS_REALES_VIEW;
                       }
                   }        
                   /************** Valores por defecto elegidos para Cuenta y Modulo - Fin *************/            
                   
                   //Obtiene el listado de Unidad de Moneda
                   String codCuentas = Util.arrayToString((String[])session.getAttribute("chksCuenta"),",");
                   String codModulos = Util.arrayToString((String[])session.getAttribute("chksModulo"),",");                  

                   //Agregar el codigo de cuenta de la pagina
                   List listadoUnidMone = servicioHermetic.getTipoUnidadMonetariaCuentaMulti(sucursal , cliente, codCuentas);
                   if (listadoUnidMone != null) {
                       model.put("listadoUnidMone", listadoUnidMone);
                   }  

                   List listaModulosNoReal = 
                       servicioHermetic.getDenominacionMonedaSaldoNoReal(form.getTipoUnidMone() , 
                                                                        cliente, sucursal, 
                                                                        codCuentas, codModulos, 
                                                                        fecha);
                   List listaModulos = 
                       servicioHermetic.getDenominacionMonedaSaldoReal(form.getTipoUnidMone(), 
                                                                    cliente, sucursal, 
                                                                    codCuentas, codModulos, 
                                                                    fecha);
                   double suma1 = 0;
                   double suma2 = 0;
                   double suma3 = 0;
                   double suma4 = 0;
                   double suma5 = 0;
                   double sumaT = 0;
                   double sumaReal = 0;
                   double sumaRealTotal = 0;
                   DecimalFormatSymbols dfs = new DecimalFormatSymbols();
                   dfs.setDecimalSeparator('.');
                   dfs.setGroupingSeparator(',');
                   DecimalFormat df1 = new DecimalFormat("###,###,##0.00", dfs);
                   DecimalFormat df2 = new DecimalFormat("###,###,##0", dfs);
                   df1.setGroupingSize(3);
                   if (listaModulos != null) {
                       List listaFormato = new ArrayList();
                       for (int i = 0; i < listaModulos.size(); i++) {
                           DenomiMonedaBean beanNR = new DenomiMonedaBean();
                           DenomiMonedaBean bean = new DenomiMonedaBean();
                           DenomiMonedaBean beanFormat = new DenomiMonedaBean();
                           bean = (DenomiMonedaBean)listaModulos.get(i);
                           beanNR = (DenomiMonedaBean)listaModulosNoReal.get(i);
                           suma1 = suma1 + Double.parseDouble(bean.getSaldo1()!=null?bean.getSaldo1():"0") + Double.parseDouble(beanNR.getSaldo1()!=null?beanNR.getSaldo1():"0");
                           suma2 = suma2 + Double.parseDouble(bean.getSaldo2()!=null?bean.getSaldo2():"0") + Double.parseDouble(beanNR.getSaldo2()!=null?beanNR.getSaldo2():"0");
                           suma3 = suma3 + Double.parseDouble(bean.getSaldo3()!=null?bean.getSaldo3():"0") + Double.parseDouble(beanNR.getSaldo3()!=null?beanNR.getSaldo3():"0");
                           suma4 = suma4 + Double.parseDouble(bean.getSaldo4()!=null?bean.getSaldo4():"0") + Double.parseDouble(beanNR.getSaldo4()!=null?beanNR.getSaldo4():"0");
                           suma5 = suma5 + Double.parseDouble(bean.getSaldo5()!=null?bean.getSaldo5():"0") + Double.parseDouble(beanNR.getSaldo5()!=null?beanNR.getSaldo5():"0");
                           beanFormat.setDesTipo(bean.getDesTipo());
                           beanFormat.setTipoMoneda(bean.getTipoMoneda());
                           beanFormat.setCodDenominacion(bean.getCodDenominacion());
                           beanFormat.setValor(df1.format(Double.parseDouble(bean.getValor())));
                           beanFormat.setSaldo1(df1.format(Double.parseDouble(bean.getSaldo1()!=null?bean.getSaldo1():"0") + Double.parseDouble(beanNR.getSaldo1()!=null?beanNR.getSaldo1():"0")));
                           beanFormat.setSaldo2(df1.format(Double.parseDouble(bean.getSaldo2()!=null?bean.getSaldo2():"0") + Double.parseDouble(beanNR.getSaldo2()!=null?beanNR.getSaldo2():"0")));
                           beanFormat.setSaldo3(df1.format(Double.parseDouble(bean.getSaldo3()!=null?bean.getSaldo3():"0") + Double.parseDouble(beanNR.getSaldo3()!=null?beanNR.getSaldo3():"0")));
                           beanFormat.setSaldo4(df1.format(Double.parseDouble(bean.getSaldo4()!=null?bean.getSaldo4():"0") + Double.parseDouble(beanNR.getSaldo4()!=null?beanNR.getSaldo4():"0")));
                           beanFormat.setSaldo5(df1.format(Double.parseDouble(bean.getSaldo5()!=null?bean.getSaldo5():"0") + Double.parseDouble(beanNR.getSaldo5()!=null?beanNR.getSaldo5():"0")));
                           beanFormat.setTotal2(df1.format(Double.parseDouble(bean.getSaldo1()!=null?bean.getSaldo1():"0") + 
                                                           Double.parseDouble(bean.getSaldo2()!=null?bean.getSaldo2():"0") + 
                                                           Double.parseDouble(bean.getSaldo3()!=null?bean.getSaldo3():"0") + 
                                                           Double.parseDouble(bean.getSaldo4()!=null?bean.getSaldo4():"0") + 
                                                           Double.parseDouble(bean.getSaldo5()!=null?bean.getSaldo5():"0") +
                                                           Double.parseDouble(beanNR.getSaldo1()!=null?beanNR.getSaldo1():"0") + 
                                                           Double.parseDouble(beanNR.getSaldo2()!=null?beanNR.getSaldo2():"0") + 
                                                           Double.parseDouble(beanNR.getSaldo3()!=null?beanNR.getSaldo3():"0") + 
                                                           Double.parseDouble(beanNR.getSaldo4()!=null?beanNR.getSaldo4():"0") + 
                                                           Double.parseDouble(beanNR.getSaldo5()!=null?beanNR.getSaldo5():"0")));
                           sumaReal = Double.parseDouble(bean.getSaldo1()!=null?bean.getSaldo1():"0") + 
                                      Double.parseDouble(bean.getSaldo2()!=null?bean.getSaldo2():"0") + 
                                      Double.parseDouble(bean.getSaldo3()!=null?bean.getSaldo3():"0") + 
                                      Double.parseDouble(bean.getSaldo4()!=null?bean.getSaldo4():"0") + 
                                      Double.parseDouble(bean.getSaldo5()!=null?bean.getSaldo5():"0") +
                                      Double.parseDouble(servicioHermetic.getSaldoTotalReal(sucursal,cliente,codCuentas,codModulos,fecha,bean.getTipoMoneda(),bean.getCodDenominacion()));
                           sumaRealTotal = sumaRealTotal + sumaReal;
                           beanFormat.setSumaDenoReal(df1.format(sumaReal));
                           
                           listaFormato.add(beanFormat);
                       }
                       sumaT = suma1 + suma2 + suma3 + suma4 + suma5;

                       model.put("suma1", df1.format(suma1));
                       model.put("suma2", df1.format(suma2));
                       model.put("suma3", df1.format(suma3));
                       model.put("suma4", df1.format(suma4));
                       model.put("suma5", df1.format(suma5));
                       model.put("sumaT", df1.format(sumaT));
                       model.put("sumaRealTotal", df1.format(sumaRealTotal));

                       model.put("listaModulos", listaFormato);
                   }
                   List listadoCuentas = 
                       servicioHermetic.getCuentas(sucursal, cliente);
                   if (listadoCuentas != null) {
                       model.put("listaCuentas", listadoCuentas);
                   }
                   
                   //CALCULO TOTAL
                   //List listaModulos2 = servicioHermetic.getBovedaCuenta(sucursal, cliente, cuenta);
                   //if (listaModulos2 != null) {
                       //model.put("listaModulo", listaModulos2);
                       
                       //form.setCuenta(cuenta);
                       //form.setModulo(boveda);
                       form.setFechadesde(fecha);
                       form.setFechahasta(fechaOri);
                       fecha = fecha.substring(6, 10) + fecha.substring(3, 5) + fecha.substring(0,2);
                       /* 
                       fechaOri = 
                               fechaOri.substring(6, 10) + fechaOri.substring(3, 5) + 
                               fechaOri.substring(0, 2);*/
                       if (fecha.compareTo(fechaOri) < 0)
                           form.setHora("AL CIERRE");
                       else
                           form.setHora(horaori);

                       ComprobanteServicioBean totales = 
                           new ComprobanteServicioBean();
                       ComprobanteServicioBean totalesNR = 
                           new ComprobanteServicioBean();
                       totales = servicioHermetic.getDetalleCSReal(form.getFechadesde(), 
                                                                   cliente, codCuentas, 
                                                                   codModulos, sucursal);
                       totalesNR = servicioHermetic.getDetalleCSNoReal(form.getFechadesde(), 
                                                                   cliente, codCuentas, 
                                                                   codModulos, sucursal);
                       if (totales.getCantidad() != null && totalesNR.getCantidad() != null)
                           model.put("cantidadT", 
                                                df2.format(Double.parseDouble(totales.getCantidad()) +
                                                           Double.parseDouble(totalesNR.getCantidad())) );
                       else
                           model.put("cantidadT", "0");
                       if (totales.getTotal() != null) {
                           model.put("totalT", 
                                                df1.format(Double.parseDouble(totales.getTotal()) +
                                                           Double.parseDouble(totalesNR.getTotal()) ));
                           sumaT = sumaT + Double.parseDouble(totales.getTotal()) + 
                                           Double.parseDouble(totalesNR.getTotal());
                       } else
                           model.put("totalT", "0.00");

                           model.put("totalS", df1.format(sumaT));
                           
                   //}
                   model.put(FORM_KEY,form);  
               } catch (Exception e) {
                   e.printStackTrace();
                   //accionMapa = 0;
                   return FORM_ERROR_VIEW;
               }

               return FORM_SALDOS_REALES_VIEW;
           }

}
